import axios from 'axios'
import { showToast, showDialog, showLoadingToast } from 'vant';
import sessionManager, { getToken, clearSession } from '@/utils/auth/sessionManager'

// 创建axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 15000 // 请求超时时间
})

// 存储加载提示实例的Map
const loadingInstances = new Map();

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 从会话管理获取token
    const token = getToken()
    if (token) {
      // 设置请求头
      config.headers['AX-Access-Token'] = token
    }
  

    // 不设置content-type，让axios自动设置
    // 这样可以避免CORS预检请求中的content-type问题
    if (config.method === 'post' || config.method === 'put' || config.method === 'delete') {
      // 只在需要时设置content-type
      if (!config.headers['Content-Type']) {
            config.headers['Content-Type'] = 'application/json'
      }
      
      // 非GET请求显示加载提示
      if (config.method !== 'get' && !config.hideLoading) {
        const loadingToast = showLoadingToast({
          message: '加载中...',
          forbidClick: true,
          duration: 0 // 不自动关闭
        });
        
        // 使用请求URL作为key存储loading实例
        const requestId = config.url + Date.now();
        config.requestId = requestId;
        loadingInstances.set(requestId, loadingToast);
      }
    }
    
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 关闭对应的loading
    const requestId = response.config.requestId;
    if (requestId && loadingInstances.has(requestId)) {
      const loadingToast = loadingInstances.get(requestId);
      loadingToast.close();
      loadingInstances.delete(requestId);
    }
    
    const res = response.data
    // 根据状态码处理不同情况
    if (res.code === 0) {
      // 成功，返回数据
      return res
    } else if (res.code === 2) {
      // code为2表示登录已过期
      //console.error('登录已过期:', res.message)
      // 使用会话管理清除用户信息并跳转到首页
      clearSession()
      window.location.href = '/home'
      return Promise.reject(new Error(res.message || '登录已过期'))
    } else {
      // 其他错误，显示错误提示，3秒后自动关闭
      showToast({
        message: res.message || '未知错误',
        duration: 2000 // 3秒后自动关闭
      });
      //console.error('接口返回错误:', res.message)
      return Promise.reject(new Error(res.message || '未知错误'))
    }
  },
  error => {
    // 关闭对应的loading
    if (error.config && error.config.requestId && loadingInstances.has(error.config.requestId)) {
      const loadingToast = loadingInstances.get(error.config.requestId);
      loadingToast.close();
      loadingInstances.delete(error.config.requestId);
    }
    
    //console.error('响应错误:', error)
    // 网络错误等情况，显示错误提示，3秒后自动关闭
    showToast({
      message: '网络请求失败，请检查网络连接',
      duration: 2000 // 3秒后自动关闭
    });
    return Promise.reject(error)
  }
)

// 扩展service，添加一个不显示loading的请求方法
service.requestWithoutLoading = (config) => {
  return service({
    ...config,
    hideLoading: true
  });
};

export default service
